﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace devoirBD2
{
    public class Commande
    {
        //Champs de la table commande
        private long idCommande;
        private long idFournisseur;
        private DateTime dateCommande;

        //Champs provenant d'autres tables ou d'un calcul
        private string nomFournisseur;
        private decimal montant;

        //Lignes de la commande
        private List<CommandeLigne> lignes;

        public Commande()
        {
            lignes = new List<CommandeLigne>();
        }

        public Commande(long idCommande, long idFournisseur, DateTime dateCommande, string nomFournisseur, decimal montant)
        {
            this.idCommande = idCommande;
            this.idFournisseur = idFournisseur;
            this.dateCommande = dateCommande;
            this.nomFournisseur = nomFournisseur;
            this.montant = montant;
            lignes = new List<CommandeLigne>();
        }

        public string[] getLigne()
        {
            return new string[]{
                idCommande.ToString(),
                nomFournisseur,
                dateCommande.ToShortDateString(),
                String.Format("{0:0.00}", montant) + "$"
            };
        }

        public void loadLignes()
        {
            lignes.Clear();

            string query = "SELECT idproduit, quantite, prix, nomproduit ";
            query += "FROM (SELECT idproduit, quantite, prix FROM commandedetail WHERE idcommande = " + idCommande.ToString() +") ";
            query += "NATURAL INNER JOIN (SELECT idproduit, nomproduit FROM produit) ";

            Bd bd = Bd.getInstance();

            bd.openConnection();

            OracleDataReader dr = bd.executeReader(query);

            while (dr.Read())
            {
                CommandeLigne ligne = new CommandeLigne(idCommande,
                                            Bd.valideLong(dr["idproduit"]),
                                            Bd.valideLong(dr["quantite"]),
                                            Bd.valideDecimal(dr["prix"]),
                                            Bd.valideString(dr["nomproduit"]));

                lignes.Add(ligne);
            }

            bd.closeConnection();
        }

        public List<CommandeLigne> getCommandeLignes()
        {
            return lignes;
        }

        public long getIdCommande()
        {
            return idCommande;
        }

        public decimal getMontant()
        {
            return montant;
        }

        public void delete()
        {
            string query = "DELETE FROM commandeentete WHERE idcommande = " + idCommande.ToString();

            Bd bd = Bd.getInstance();

            bd.openConnection();

            bd.executeUpdate(query);

            bd.closeConnection();
        }

        private void insert()
        {
            string query = "INSERT INTO commandeentete(idfournisseur, datecommande) values(" + idFournisseur.ToString() + ",TO_DATE('" + dateCommande.Year.ToString() + "-" + dateCommande.Month.ToString().PadLeft(2, '0') + "-" + dateCommande.Day.ToString().PadLeft(2, '0') + "','YYYY-MM-DD'))";

            Bd bd = Bd.getInstance();

            bd.openConnection();

            idCommande = bd.executeInsert(query, "idcommande");

            bd.closeConnection();
        }

        private void update()
        {
            string query = "UPDATE commandeentete SET idfournisseur = " + idFournisseur.ToString() + ", datecommande = TO_DATE('" + dateCommande.Year.ToString() + "-" + dateCommande.Month.ToString().PadLeft(2, '0') + "-" + dateCommande.Day.ToString().PadLeft(2, '0') + "','YYYY-MM-DD') WHERE idcommande = " + idCommande.ToString();

            Bd bd = Bd.getInstance();

            bd.openConnection();

            bd.executeUpdate(query);

            bd.closeConnection();
        }

        public void enregistrer(Fournisseur f, DateTime dateCommande)
        {
            this.idFournisseur = f.getIdFournisseur();
            this.nomFournisseur = f.getNomFournisseur();
            this.dateCommande = dateCommande;

            if (idCommande == 0)
            {
                insert();
            }
            else
            { 
                update();
            }
        }

        public string getNomFournisseur()
        {
            return nomFournisseur;
        }

        public DateTime getDateCommande()
        {
            return dateCommande;
        }

        public void ajouterLigne(CommandeLigne ligne)
        {
            lignes.Add(ligne);
        }

        public void deleteCommandeLigne(int[] indices)
        {
            List<CommandeLigne> clASupprimer = new List<CommandeLigne>();

            foreach (int i in indices)
            {
                //On crée une liste des objets à supprimer
                clASupprimer.Add(lignes[i]);

                //On supprime la commande de la base de données.
                lignes[i].delete();
            }

            //On boucle dans les commandes à supprimer
            foreach (CommandeLigne cmd in clASupprimer)
            {
                //On enlève l'objet de la liste des commandes
                lignes.Remove(cmd);
            }
        }
    }
}
